
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>什么是锁膨胀升级 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>什么是锁膨胀升级 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">什么是Java中的“锁膨胀升级”现象？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">锁膨胀升级指的是在多线程竞争激烈的场景下，锁从一种较轻的状态（如偏向锁）逐步升级到更重的状态（如轻量级锁，最终到重量级锁），这个过程伴随着系统资源消耗增加和执行效率降低，从而引发性能下降的现象。</div>
          </div>
          <div class="card-source">来源: 文档中「锁膨胀升级的定义」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">请描述Java中锁的三种状态及其升级路径。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Java中的锁有三种状态：<br>1. 偏向锁（Biased Locking）：初始状态，适用于无竞争或极低竞争场景，优化单线程反复进入临界区。<br>2. 轻量级锁（Lightweight Locking）：当有第二个线程尝试获取偏向锁时，锁膨胀为此状态，使用CAS操作尝试获取锁，适用于少量竞争场景。<br>3. 重量级锁（Heavyweight Locking）：当多线程激烈争夺锁时，轻量级锁膨胀为此状态，通过操作系统同步机制实现，适用于高竞争场景。</div>
          </div>
          <div class="card-source">来源: 文档中「1. 锁的状态和升级路径」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">影响</div>
          <div class="card-question">锁膨胀为重量级锁后，为什么会导致系统性能下降？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">影响</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当锁膨胀为重量级锁后，它依赖操作系统的互斥机制。线程获取锁失败时会进入阻塞状态，锁释放时又被唤醒。这个过程涉及高昂的线程上下文切换成本，会导致CPU缓存失效、增加系统开销，从而使系统整体性能下降。</div>
          </div>
          <div class="card-source">来源: 文档中「1. 性能下降」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">除了线程竞争激烈，还有哪些原因会导致锁膨胀升级？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">导致锁膨胀升级的原因还包括：线程数的增加加剧资源争夺；锁的粒度不合理（过粗的锁成为竞争热点）；递归调用或锁重入（JVM可能直接将锁升级以支持递归）；以及偏向锁撤销和自旋策略失败带来的开销。</div>
          </div>
          <div class="card-source">来源: 文档中「锁膨胀升级的原因」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">优化</div>
          <div class="card-question">如何通过合理设计锁的粒度来优化锁膨胀问题？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">优化</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">主要有两种方式：<br>1. 细粒度锁替代粗粒度锁：将一个大范围的锁拆分为多个小范围的锁（如使用分段锁），以减少线程间的竞争。<br>2. 减少临界区的大小：缩小需要同步的代码区域，让线程持有锁的时间变短，从而降低锁竞争的概率。</div>
          </div>
          <div class="card-source">来源: 文档中「1. 合理设计锁的粒度」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在读多写少的场景下，应如何选择锁的类型以避免不必要的锁膨胀？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在读多写少的场景下，应使用读写锁（如 ReentrantReadWriteLock）来替代传统的互斥锁。读写锁允许多个读线程同时访问共享资源，只有写线程需要独占锁，这样可以显著提升并发性能，减少锁争用，从而降低锁膨胀的可能性。</div>
          </div>
          <div class="card-source">来源: 文档中「2. 优化锁的使用方式」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">自旋锁在锁机制中扮演什么角色？它为什么可能最终触发锁膨胀？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">自旋锁被用于轻量级锁的获取阶段，线程在尝试获取锁时会进行短暂的循环等待（自旋）而不是立即阻塞，以避免上下文切换。但是，如果锁竞争激烈，线程自旋多次后仍无法获得锁，JVM为了避免CPU资源被长时间浪费，会将锁升级为重量级锁。</div>
          </div>
          <div class="card-source">来源: 文档中「5. 锁撤销和自旋策略」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">优化</div>
          <div class="card-question">除了代码层面的优化，还可以通过哪些JVM参数来调优锁膨胀问题？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">优化</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">可以通过优化JVM参数来调优，例如：<br>1. 使用 `-XX:-UseBiasedLocking` 禁用偏向锁，或使用 `-XX:BiasedLockingStartupDelay` 调整偏向锁延迟。<br>2. 使用 `-XX:PreBlockSpin` 调整轻量级锁的自旋次数。<br>3. 使用 `-XX:+UseThreadPriorities` 调整线程调度策略。</div>
          </div>
          <div class="card-source">来源: 文档中「4. 优化JVM参数配置」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">架构</div>
          <div class="card-question">在架构设计层面，有哪些策略可以减少共享资源竞争，从而规避锁膨胀问题？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">架构</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">架构层面的策略包括：<br>1. 减少共享资源：通过数据分区或分片，将数据划分到不同节点，减少对单一资源的并发访问。<br>2. 采用消息队列解耦：通过消息队列实现异步处理，避免多个线程同时争抢锁。<br>3. 使用微服务架构：将应用拆分为独立服务，减少不同业务模块间的锁竞争。</div>
          </div>
          <div class="card-source">来源: 文档中「5. 架构层面的优化」部分</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
